package android.slc.box.commonlibrary.compat;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RuntimeUtil;

import java.io.File;
import java.nio.charset.Charset;
import java.util.List;

/**
 * SlcRuntimeCompatUtils 完善
 * [cmd] 命令,window记得要使用cmd /c开头,如cmd /c ipconfig
 */
public class SlcRuntimeUtils {
    /**
     * 执行系统命令，使用系统默认编码
     *
     * @param dir  命令行所在路径
     * @param cmds 命令列表，每个元素代表一条命令
     * @return 执行结果
     * @throws IORuntimeException IO异常
     */
    public static String execForStr(String dir, String... cmds) throws IORuntimeException {
        return execForStr(CharsetUtil.systemCharset(), dir, cmds);
    }

    public static String execForStr(File dir, String... cmds) throws IORuntimeException {
        return execForStr(CharsetUtil.systemCharset(), dir, cmds);
    }

    /**
     * 执行系统命令，使用传入的 {@link Charset charset} 编码
     *
     * @param charset 编码
     * @param dir     命令行所在路径
     * @param cmds    命令列表，每个元素代表一条命令
     * @return 执行结果
     * @throws IORuntimeException IO异常
     * @since 3.1.2
     */
    public static String execForStr(Charset charset, String dir, String... cmds) throws IORuntimeException {
        return RuntimeUtil.getResult(exec(dir, cmds), charset);
    }

    public static String execForStr(Charset charset, File dir, String... cmds) throws IORuntimeException {
        return RuntimeUtil.getResult(exec(dir, cmds), charset);
    }

    /**
     * 执行系统命令，使用系统默认编码
     *
     * @param dir  命令行所在路径
     * @param cmds 命令列表，每个元素代表一条命令
     * @return 执行结果，按行区分
     * @throws IORuntimeException IO异常
     */
    public static List<String> execForLines(String dir, String... cmds) throws IORuntimeException {
        return execForLines(CharsetUtil.systemCharset(), dir, cmds);
    }

    public static List<String> execForLines(File dir, String... cmds) throws IORuntimeException {
        return execForLines(CharsetUtil.systemCharset(), dir, cmds);
    }

    /**
     * 执行系统命令，使用传入的 {@link Charset charset} 编码
     *
     * @param charset 编码
     * @param dir     命令行所在路径
     * @param cmds    命令列表，每个元素代表一条命令
     * @return 执行结果，按行区分
     * @throws IORuntimeException IO异常
     * @since 3.1.2
     */
    public static List<String> execForLines(Charset charset, String dir, String... cmds) throws IORuntimeException {
        return RuntimeUtil.getResultLines(exec(dir, cmds), charset);
    }

    public static List<String> execForLines(Charset charset, File dir, String... cmds) throws IORuntimeException {
        return RuntimeUtil.getResultLines(exec(dir, cmds), charset);
    }


    /**
     * 执行命令<br>
     * 命令带参数时参数可作为其中一个参数，也可以将命令和参数组合为一个字符串传入
     *
     * @param dir  执行命令所在目录（用于相对路径命令执行），null表示使用当前进程执行的目录
     * @param cmds 命令
     * @return {@link Process}
     * @since 4.1.6
     */
    public static Process exec(String dir, String... cmds) {
        return RuntimeUtil.exec(null, FileUtil.file(dir), cmds);
    }

    /**
     * 执行命令<br>
     * 命令带参数时参数可作为其中一个参数，也可以将命令和参数组合为一个字符串传入
     *
     * @param dir  执行命令所在目录（用于相对路径命令执行），null表示使用当前进程执行的目录
     * @param cmds 命令
     * @return {@link Process}
     * @since 4.1.6
     */
    public static Process exec(File dir, String... cmds) {
        return RuntimeUtil.exec(null, dir, cmds);
    }
}
